//#include <stdio.h>
//#include <stdlib.h>
//#include <pthread.h>
//#include <unistd.h>
//
//#define BUFFER_SIZE 10  // 缓冲区大小
//#define NUM_ITEMS 20    // 总共要生产和消费的产品数
//
//int buffer[BUFFER_SIZE];  // 缓冲区
//int count = 0;            // 当前缓冲区中的产品数
//pthread_mutex_t mutex;    // 互斥锁
//pthread_cond_t not_empty; // 非空条件变量
//pthread_cond_t not_full;  // 非满条件变量
//
//void* producer(void* arg) {
//    for (int i = 0; i < NUM_ITEMS; i++) {
//        // 生产产品
//        int item = rand() % 100; // 生成随机产品
//        pthread_mutex_lock(&mutex); // 上锁
//        while (count == BUFFER_SIZE) { // 缓冲区满，等待
//            pthread_cond_wait(&not_full, &mutex);
//        }
//        // 将产品放入缓冲区
//        buffer[count++] = item;
//        printf("Produced: %d\n", item);
//        pthread_cond_signal(&not_empty); // 通知消费者
//        pthread_mutex_unlock(&mutex); // 解锁
//        sleep(rand() % 2); // 随机睡眠
//    }
//    return NULL;
//}
//
//void* consumer(void* arg) {
//    for (int i = 0; i < NUM_ITEMS; i++) {
//        pthread_mutex_lock(&mutex); // 上锁
//        while (count == 0) { // 缓冲区空，等待
//            pthread_cond_wait(&not_empty, &mutex);
//        }
//        // 从缓冲区取出产品
//        int item = buffer[--count];
//        printf("Consumed: %d\n", item);
//        pthread_cond_signal(&not_full); // 通知生产者
//        pthread_mutex_unlock(&mutex); // 解锁
//        sleep(rand() % 2); // 随机睡眠
//    }
//    return NULL;
//}
//
//int main() {
//    pthread_t prod_thread, cons_thread;
//
//    // 初始化互斥锁和条件变量
//    pthread_mutex_init(&mutex, NULL);
//    pthread_cond_init(&not_empty, NULL);
//    pthread_cond_init(&not_full, NULL);
//
//    // 创建生产者和消费者线程
//    pthread_create(&prod_thread, NULL, producer, NULL);
//    pthread_create(&cons_thread, NULL, consumer, NULL);
//
//    // 等待线程结束
//    pthread_join(prod_thread, NULL);
//    pthread_join(cons_thread, NULL);
//
//    // 销毁互斥锁和条件变量
//    pthread_mutex_destroy(&mutex);
//    pthread_cond_destroy(&not_empty);
//    pthread_cond_destroy(&not_full);
//
//    return 0;
//}
//


#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define BUFFER_SIZE 5

int buffer[BUFFER_SIZE];
int count = 0;  // 当前缓冲区中的项目数量
pthread_mutex_t mutex;  // 互斥锁
pthread_cond_t not_empty;  // 缓冲区不为空条件变量
pthread_cond_t not_full;   // 缓冲区不满条件变量

void *producer(void *arg) {
    for (int i = 0; i < 10; i++) {
        pthread_mutex_lock(&mutex);
        while (count == BUFFER_SIZE) {
            pthread_cond_wait(&not_full, &mutex);
        }
        // 生产一个项目
        buffer[count++] = i;
        printf("Produced: %d\n", i);
        pthread_cond_signal(&not_empty);  // 唤醒消费者
        pthread_mutex_unlock(&mutex);
        sleep(1);  // 模拟生产时间
    }
    return NULL;
}

void *consumer(void *arg) {
    for (int i = 0; i < 10; i++) {
        pthread_mutex_lock(&mutex);
        while (count == 0) {
            pthread_cond_wait(&not_empty, &mutex);
        }
        // 消费一个项目
        int item = buffer[--count];
        printf("Consumed: %d\n", item);
        pthread_cond_signal(&not_full);  // 唤醒生产者
        pthread_mutex_unlock(&mutex);
        sleep(2);  // 模拟消费时间
    }
    return NULL;
}

int main() {
    pthread_t producer_thread, consumer_thread;

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&not_empty, NULL);
    pthread_cond_init(&not_full, NULL);

    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);

    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&not_empty);
    pthread_cond_destroy(&not_full);

    return 0;
}

